﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Common.Validation;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic.BusinessRuleValidation {

	/// <summary>
	/// Validador de inclusão de verificação de politica de corretagem
	/// </summary>
    public class ValidaInclusaoVerificacaoPolitica : BaseBusinessRuleValidation<BusinessEntity.VerificacaoPolitica>, IBusinessRuleValidation
    {
        #region Atributos 

		private int _erroObjetoNulo = 109565;
		private int _informeCondicaoVerificacao = 109566;
		private int _verificacaoExistente = 109567; 

		#endregion

		#region Propriedades 

        /// <summary>
        /// Objeto Nulo
        /// </summary>
		public int ErroObjetoNulo{
			get
			{
				return _erroObjetoNulo;
			}
			set
			{
				_erroObjetoNulo = value;
			}
		}

        /// <summary>
        /// Informe Condicao Verificacao
        /// </summary>
		public int InformeCondicaoVerificacao{
			get
			{
				return _informeCondicaoVerificacao;
			}
			set
			{
				_informeCondicaoVerificacao = value;
			}
		}

        /// <summary>
        /// Verificacao Existente
        /// </summary>
		public int VerificacaoExistente{
			get
			{
				return _verificacaoExistente;
			}
			set
			{
				_verificacaoExistente = value;
			}
		} 

		#endregion

		#region Construtor

        /// <summary>
        /// Construtor ValidaInclusaoVerificacaoPolitica
        /// </summary>
		public ValidaInclusaoVerificacaoPolitica(){} 

		#endregion 

		#region Métodos 

		public void Validate()
        {
            List<BusinessEntity.VerificacaoPolitica> listaVerificacaoPolitica = null;
            SinacorValidation validation = null;

            if (base.EntityToValidate != null)
            {
                try
                {
                    //Validação de RulesSets
                    validation = new SinacorValidation();
                    validation.Validate<BusinessEntity.VerificacaoPolitica>(base.EntityToValidate, "ValidarVerificacaoPolitica");

                    //Verificação das condições
                    if (string.IsNullOrEmpty(EntityToValidate.Ativo)) {
                        if (!EntityToValidate.Carteira.HasValue) {
                            if (!EntityToValidate.CodigoAgente.HasValue) {
                                if (!EntityToValidate.CodigoAssessor.HasValue) {
                                    if(!EntityToValidate.CodigoTabelaBeneficio.HasValue) {
                                        if (!EntityToValidate.CodigoTabelaPadrao.HasValue) {
                                            if (!EntityToValidate.NaturezaOperacao.HasValue) {
                                                if (EntityToValidate.TipoOperacao == null) {
                                                    this.AddValidationError(InformeCondicaoVerificacao);
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    //Verificação de política de corretagem
                    ResourceAccess.VerificacaoPolitica raVerificacaoPolitica = new ResourceAccess.VerificacaoPolitica();
                    BusinessEntity.Parameter.FiltroVerificacaoPolitica filtroVerificacaoPolitica = ConstructFiltroVerificacaoPolitica();
                    listaVerificacaoPolitica = raVerificacaoPolitica.ConsultarVerificacoesPoliticas(filtroVerificacaoPolitica);

                    //Política de corretagem existe
                    if (listaVerificacaoPolitica.Count > 0)
                    {
                        this.AddValidationError(VerificacaoExistente);
                    }
                }
                catch (ValidationException ve)
                {
                    base.AddValidationError(ve.ValidationErrors);
                }
            }
            else
            {
                this.AddValidationError(ErroObjetoNulo);
            }
		}

        private BusinessEntity.Parameter.FiltroVerificacaoPolitica ConstructFiltroVerificacaoPolitica()
        {
            BusinessEntity.Parameter.FiltroVerificacaoPolitica filtroVerificacaoPolitica = new Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.Parameter.FiltroVerificacaoPolitica();

            filtroVerificacaoPolitica.Ativo = EntityToValidate.Ativo;
            filtroVerificacaoPolitica.Carteira = EntityToValidate.Carteira;
            filtroVerificacaoPolitica.CodigoAgente = EntityToValidate.CodigoAgente;
            filtroVerificacaoPolitica.CodigoAssessor = EntityToValidate.CodigoAssessor;
            filtroVerificacaoPolitica.CodigoOperador = EntityToValidate.CodigoOperador;
            filtroVerificacaoPolitica.CodigoPolitica = EntityToValidate.CodigoPolitica;
            filtroVerificacaoPolitica.CodigoTabelaBeneficio = EntityToValidate.CodigoTabelaBeneficio;
            filtroVerificacaoPolitica.CodigoTabelaPadrao = EntityToValidate.CodigoTabelaPadrao;
            filtroVerificacaoPolitica.DataInicial = EntityToValidate.DataInicial;
            filtroVerificacaoPolitica.Mercado = EntityToValidate.Mercado;
            filtroVerificacaoPolitica.NaturezaOperacao = EntityToValidate.NaturezaOperacao;
            filtroVerificacaoPolitica.TipoOperacao = EntityToValidate.TipoOperacao;

            return filtroVerificacaoPolitica;
        }

        /// <summary>
        /// Retorna uma lista de Erros
        /// </summary>
        /// <returns></returns>
        public List<ValidationError> GetErrors()
        {
            return base.ErrorsList;
        } 

		#endregion 
	}
}